#  time_values: {time: money}
#  思考的时间是完成一轮工作的时刻

ONE_DAY = 360
ONE_HOUR = 30
ONE_MIN = 2


def health_change(rider_info, num, add_num):
    """
    更新体力值和身体状态
    :param rider_info: 旗手信息
    :param num: 当前体力值
    :param add_num: 休息的时间
    :return:
    """
    num += add_num
    if num > 12: num = 12
    rider_info["health"] = num
    if num >= 5:
        rider_info["rider_status"] = "up"
    else:
        rider_info["rider_status"] = "down"


def trick_to_time(trick_step):
    """
    360模拟一天，一个trick表示2分钟
    :param trick_step: 时间步
    :return: [hour, min]
    """
    #  360模拟一天，一个trick表示2分钟
    trick_step %= ONE_DAY
    time_hour = int(trick_step / 30)
    time_min = trick_step % 30 * 2
    return [time_hour, time_min]


def get_money_sum(time_value: dict, times_check: list):
    """
    计算每个可能工作时间最佳的工作时间
    :param time_value:
    :param times_check:
    :return:
    """
    ans = 0
    #  时间可能会是今天或者明天
    for i in times_check:
        if f"{i}" not in time_value.keys():
            ans = -1
            break
        ans += time_value[f"{i}"]
    return ans


def lists_to_best_times(nums: list, step_think):
    #  获得需要进行比较的时间
    #  num_down是trick
    nums_ans = []
    for num in nums:
        num_temp = trick_to_time(step_think)[0] + num % 12
        nums_ans.append(num_temp)
    return nums_ans


def get_best_time(time_values, time_lists, step_think):
    # 找到最佳的工作时间段。
    #  num_down 能够开始工作最晚的时间
    #  time_lists [开始工作的时间，工作的时长]
    time_money = [[0, 0, -1]]
    for time_list in time_lists:
        time_up = trick_to_time(step_think)[0] + time_list[0]
        time_down = time_up + time_list[1]
        nums = list(range(time_up, time_down + 1))
        times_check = lists_to_best_times(nums, step_think)
        ans = get_money_sum(time_values, times_check)
        if ans != -1:
            time_money.append([time_list[0], time_list[0] + time_list[1], ans])
    sorted(time_money, key=lambda money: money[2], reverse=False)
    print(time_money)
    return time_money[-1]


def get_richer_time(rider_info: dict):
    # 根据骑手的体力和时间记忆，选择最佳的工作时间段，并更新骑手的工作和休息时间。
# 如果选择的时间段收入较低，骑手将休息 6 小时，否则根据选择的最佳时间段进行更新。
    #  对时间的记忆{整数时间：获得最多的金钱} | rich_time
    #  思考如何更加靠近最佳工作的时间，体力值保留可以用来调休， 可以选择靠近更加富裕的时间赚钱，也可以选择休息积攒体力
    #  如何赚更多的钱：体力值可以用来改变时间，不满意的程度会决定这次是否可以更换时间，若选择到最佳时间进行更换，则要赞够体力值（注意时间的更改
    #  要合理）
    #  逻辑：判断不满值是否达到极限，如果达到极限，则开始判断之后的工作时间；如果没有，则积攒时间
    #  开始思考选择更改的时间

    #  体力最高值：12
    #  最多休息6小时

    #  今日工作时间步
    before_up_step = rider_info["up_time"]
    before_sleep_step = rider_info["sleep_time"]
    #  计算明日工作时间可以选择的范围
    change_range = []
    for wake_time in range(2, 8 + 1):
        work_time = rider_info["health"] + wake_time
        change_range.append([wake_time, work_time])  # 存放的是具体的工作时长

    choose_time = get_best_time(rider_info["time_values"], change_range, before_sleep_step)
    if choose_time[-1] == -1 or choose_time[-1] <= rider_info["one_day_money"]:
        print("ddddddddddddddddd", choose_time)
        rider_info["up_time"] = before_up_step + 6 * ONE_HOUR
        rider_info["sleep_time"] = rider_info["up_time"] + 7 * ONE_HOUR
        health_change(rider_info, rider_info["health"], -3)
    else:
        print("ddddddddddddddddd", choose_time)
        rider_info["up_time"] = before_up_step + choose_time[0] * ONE_HOUR
        rider_info["sleep_time"] = rider_info["up_time"] + choose_time[1] * ONE_HOUR
        health_change(rider_info, rider_info["health"], choose_time[1] - choose_time[0])
